home *** CD-ROM | disk | FTP | other *** search
- #ifndef XPKMASTER_HOOK_C
- #define XPKMASTER_HOOK_C
-
- /* Routinesheader
-
- Name: hook.c
- Main: xpkmaster
- Versionstring: $VER: hook.c 1.1 (27.12.96)
- Author: SDI
- Distribution: PD
- Description: Hook handling functions
-
- 1.0 05.10.96 : first real version
- 1.1 27.12.96 : removed V37 defines
- */
-
- #include <exec/types.h>
- #include "xpkmaster.h"
-
- typedef ULONG __asm (*regfunc) (register __a0 struct Hook *,
- register __a1 APTR,
- register __a2 APTR
- #ifdef SUPPORT_A4
- ,register __a4 ULONG
- #endif
- );
-
- ULONG __asm MyCallHookPkt(register __a0 struct Hook *hook,
- register __a1 APTR paramPacket A4PROTO)
- {
- if(!hook)
- return 0;
-
- return (*(regfunc) hook->h_Entry) (hook, paramPacket, NULL A4SUPP);
- }
-
- #ifdef DEBUG
- static STRPTR action_names[8] =
- {"<zero>", "XIO_READ", "XIO_WRITE", "XIO_FREE", "XIO_ABORT", "XIO_GETBUF",
- "XIO_SEEK", "XIO_TOTSIZE" };
- #endif
-
- /*************************** read from input hook ************************/
-
- APTR hookread(struct XpkBuffer *xbuf, ULONG action, APTR buf, ULONG size)
- {
- LONG res;
-
- xbuf->xb_RMsg.xmm_Type = action;
- xbuf->xb_RMsg.xmm_Ptr = (STRPTR) buf;
- xbuf->xb_RMsg.xmm_Size = size;
-
- if((res = MyCallHookPkt(xbuf->xb_RHook, &xbuf->xb_RMsg A4SUPP2)))
- {
- // xbuf->xb_Result2 = xbuf->xb_RMsg.xmm_IOError;
- xbuf->xb_Result = res;
- }
-
- if(xbuf->xb_Result)
- {
- #ifdef DEBUG
- DebugError("hookread: %s <%ld> (%ld)", action_names[(action&7)], action,
- xbuf->xb_Result);
- #endif
- return NULL;
- }
- else if(xbuf->xb_RMsg.xmm_Ptr)
- return (APTR) xbuf->xb_RMsg.xmm_Ptr;
- else
- return (APTR) -1; /* SEEK may return 0 an success! */
- }
-
-
- /*************************** write to output hook ************************/
-
- APTR hookwrite(struct XpkBuffer *xbuf, ULONG action, APTR buf, ULONG size)
- {
- LONG res;
-
- xbuf->xb_WMsg.xmm_Type = action;
- xbuf->xb_WMsg.xmm_Ptr = (STRPTR) buf;
- xbuf->xb_WMsg.xmm_Size = size;
-
- if((res = MyCallHookPkt(xbuf->xb_WHook, &xbuf->xb_WMsg A4SUPP2)))
- {
- xbuf->xb_Result = res;
- // xbuf->xb_Result2 = xbuf->xb_WMsg.xmm_IOError;
- }
- else if(action == XIO_WRITE)
- xbuf->xb_OutLen += size;
-
- if(xbuf->xb_Result)
- {
- #ifdef DEBUG
- DebugError("hookwrite: %s <%ld> (%ld)", action_names[(action&7)], action,
- xbuf->xb_Result);
- #endif
- return NULL;
- }
- else if(xbuf->xb_WMsg.xmm_Ptr)
- return (APTR) xbuf->xb_WMsg.xmm_Ptr;
- else
- return (APTR) -1; /* SEEK may return 0 an success! */
- }
-
- #endif /* XPKMASTER_HOOK_C */
-